Klasat dhe objektet
Deklarimi i nje klase
Forma e pergjithshme per te deklaruar nje klase ne PHP eshte si me poshte:
<?php
class Makine {
//Variablat anetare
public $ngjyra;
public $shpejtesia = 120;
//Funksionet anetare ose metodat
function nisu() {
//trupi i funksionit
}
function freno() {
//trupi i funksionit
}
}
Klasa e mesiperme normalisht qe nuk eshte e plote pasi nje objekt i tipit Makine
ne jeten reale permban shume me shume atribute (variabla anetare) dhe sjellje (funskione anetare), por e paraqesim pjeserisht per arsye shpjegimi. Le te shpjegojme me radhe cdo rresht ne kodin e mesiperm:
- Per te deklaruar nje klase perdorim termin
class
shoqeruar me emrin e klases p.sh.Makine
dhe me pas vjen trupi i klases qe mbeshtillet nga kllapat{
dhe}
Me pas kemi deklaruar ne trupin e klases variablat anetare si
public $ngjyra;
te ciles nuk i kemi dhene vlere fillestare, dhepublic $shpejtesia = 220;
te ciles i kemi dhene nje vlere fillestare. Termipublic
do te shpjegohet me hollesisht ne seksionet ne vijim por momentalisht duhet te dini qe percakton aksesin e ketij variabli, ne kete rast aksesi eshte publik, pra mund te aksesohet nga kushdo.Me pas kemi deklaruar dy funksione anetare (ose te quajtura ndryshe dy metoda)
function nisu()
dhefunction freno()
te cilet momentalisht nuk bejne asgje pasi trupi i tyre eshte bosh.- Deklarimi i funksioneve te klases duket i njejte si funksionet e pavarura te PHP-se (te shpjeguar ne seksionet e meparshme), por ne kete rast jane funksione lokale te klases, te cilat do te perdoren per te vendosur dhe per te aksesuar te dhenat e objekteve te ndertuar nga kjo klase.
- Te gjitha variablat anetare dhe funksionet anetare te klases perbejne trupin e klases i cili mbeshtillet nga kllapat
{
dhe}
Krijimi i objekteve
Pasi te kemi deklaruar nje klase me te gjithe anetaret e saj te nevojshem, ne mund te krijojme aq objekte sa te deshirojme te asaj tipi klase. Objektet ndertohen duke perdorur nje operator te quajtur new
.
Shembull:
<?php
$makina1 = new Makine(); //ose new Makine;
$makina2 = new Makine();
Ne seksionet e meparshme kur kemi shpjeguar variablat, kemi thene qe nje variabel mund te mbaje nje reference te nje blloku ne memorie, te nje vlere te caktuar. Edhe ne rastin e objekteve, variablat qe krijojme per te mbajtur nje objekt, mbajne nje reference te ketij objekti ne memorie. Variabli i mesiperm $makina1
mban nje reference per nje objekt te tipit Makine
, po ashtu edhe variabli $makina2
mban nje reference te nje objekti tjeter te po te njejtit tip.
Dy objektet qe krijuara me lart jane te pavarur nga njeri tjeter, dhe ekzistenca e tyre eshte e ndare nga njeri-tjetri.
Ne momentin qe ne krijojme nje objekt me ane te operatorit new
, ne memorie do te rezervohet hapesire per objektin ne fjale, ku do te vendosen te gjitha variablat anetare dhe funksionet anetare te ketij objekti (te deklaruara ne klase). Per cdo objekt te ri te krijuar ndodh e njejta gje, rezervohet nje vend ne memorie dhe ruhen variablat dhe funksionet anetare. Pra, edhe pse te te njejtit tip, objekte te ndryshme i kane te vecanta anetaret e klases.
Therritja e funksioneve dhe variablave anetare
Pasi ne krijojme nje objekt, kemi mundesine qe te perdorim variablat anetare, dhe te therrasim funksionet anetare te lidhura me ate objekt. Per te aksesuar variablat dhe funksionet anetare te nje objekti perdoret operatori ->
.
Shembull:
<?php
$makina1 = new Makine();
//Vendosim ngjyren e makines
$makina1->ngjyra = "E Bardhe";
//Nisim makinen
$makina1->nisu();
//Ndalojme makinen
$makina1->freno();
Variablat anetare te nje objekti mund t'i aksesojme duke perdorur operatorin ->
mbi objektin ne fjale $makina1->
dhe me pas shkruhet emri i variablit anetare. Me perpara funksionet i therrisnim thjesht duke perdorur emrin e funksionit shoqeruar me kllapat (
dhe )
, ku brenda kllapave mund te deklaronim nje liste me argumente. Edhe ne rastin e objekteve eshte njejta gje vetem se duhet te shoqerohen perpara me emrin e objektit dhe operatorin ->
, pra $makina1->nisu()
.
Duhet te jemi te kujdesshem sepse jo te gjitha variablat dhe funskionet anetare mund te jene te aksesueshme ne kete menyre pasi kjo varet nga lloji i aksesit qe i kemi dhene anetareve te klases, mund te jene p.sh. private
dhe nuk na lejohet aksesimi si me lart. Lloji i aksesit perben enkapsulimin i cili do te sqarohet ne nje seksion me poshte.
Perdorimi i termit $this
ne PHP
Me lart thame qe kur krijojme nje variabel qe do te mbaje nje objekt, ky variabel mban thjesht nje reference te ketij objekti ne memorie. Me ane te ketij variabli referencues me pas mund te aksesojme anetaret e klases (variablat dhe funksionet e klases) sic e trajtuam ne shembullin me lart. Por, variablat qe krijuam me lart jane jasht lokalitetit te klases, pra mbajne reference ne momentin e ndertimit te objektit. Ne shume raste eshte e nevojshme te kemi nje reference te vete objektit brenda klases, akoma pa ndertuar objektin. Kjo reference eshte e nevojshme pasi ne shume raste do te na duhet te aksesojme variablat dhe funksionet anetare te klases brenda kesaj klase, dhe jo thjesht jasht klases sic vepruam me lart. NJe reference per objektin aktual ne PHP mbahet nepermjet variablit special $this
. Ky variabel sherben per te aksesuar variablat dhe funksionet anetare te nje klase brenda vete klases.
Shembull:
<?php
class Makine {
//Variablat anetare
public $ngjyra;
public $shpejtesia = 120;
//Funksionet anetare
function nisu() {
//trupi i funksionit
}
function freno() {
$this->shpejtesia = 0;
}
}
Kemi perdorur variablin special $this
ne funksionin freno()
te klases Makine
. Kete variabel e kemi perdorur per te aksesuar variablin anetare $shpejtesia
dhe per ti dhene asaj nje vlere 0
. Pra ashtu sic aksesuam me pare nje variabel te klases jasht lokalitetit te saj $makina1->ngjyra
, me ane te $this
mund te aksesojme nje variabel brenda lokalitetit te klases. Brenda lokalitetit te klases te gjitha variablat dhe funksionet anetare jane te aksesuesshme. Me ane te $this
mund te aksesohen edhe funksionet anetare si ne shembullin me poshte:
Shembull:
<?php
class Makine {
public $shpejtesia = 120;
function ul_shpejtesine($shpejtesia) {
$this->shpejtesia = $shpejtesia;
}
function ndalo() {
$this->ul_shpejtesine(80);
$this->ul_shpejtesine(60);
$this->ul_shpejtesine(30);
$this->ul_shpejtesine(0);
}
}
Ne klasen Makine
kemi vendosur vetem anetaret qe jane te nevojshem per shpjegimin e ketij rasti. Eshte krijuar funksioni ul_shpejtesine($shpejtesia)
, i cili pranon si argument nje vlere. Ne trupin e ketij funksioni shohim $this->shpejtesia = $shpejtesia;
, pra i jep vlere variablit anetare $shpejtesia
ne varesi te vleres qe eshte kaluar tek funksioni ul_shpejtesine
.
Me pas kemi krijuar funksionin ndalo()
, i cili me ane te $this
therret funksionin anetare ul_shpejtesine
disa here duke i kaluar vlera te ndryshme deri sa shpejtesia te arrije 0
. Kjo behet per shkak qe makina mos te frenoje ne menyre te menjehershme. Ky ishte nje shembull i therritjes se nje funksioni anetare te klases nepermjet variablit special $this
.
Funksioni i konstruktorit
Funksioni i kontrusktorit eshte nje funksion special qe therritet automatikisht sa here qe nje objekt i ri krijohet. Edhe ne rast se ne nuk kemi deklaruar nje funksion te tille ne nje klase, vete PHP-ja ka parazgjedhur nje funksion te fshehur (default) qe ekzekutohet sa here qe krijohen objekte te reja te nje klase. P.sh. ne rastin e mesiperm te klases Makine
ne nuk kemi deklaruar nje funksion konstruktori, por ne brendesi ajo e permban nje te tille edhe pse bosh.
Fuksionin e konstruktorit e shfrytezojme shume ne rastet kur duam te bejme nje inicializim fillestar te variablave ose funksioneve anetare te objektit ose te dickaje tjeter sipas nevojes. Pra, ne nje fare menyre bejme nje organizim dhe nje konfigurim ne momentin qe objekti vjen ne jete. Emri i funksionit te konstruktorit eshte __construct
. Sa i perket numrit te argumenteve qe ai pranon, ajo percaktohet nga ne, ne momentin qe deklarojme kete funksion ne klase.
Shembull:
<?php
class Makine {
public $shpejtesia = 120;
function __construct( $shpejtesia ) {
$this->shpejtesia = $shpejtesia;
}
}
Ne shembullin e mesiperm eshte deklaruar funksioni i konstruktorit, i cili do te therritet gjithmone ne momentin qe ne krijojme nje objekt te ri te kesaj klase. Ne funksionin e konstruktorit ashtu si dhe ne funksionet e tjera mund te jepet mundesia e kalimit te argumenteve. Ne kete rast kemi dhene mundesine qe te kalojme nje vlere $shpejtesia
. Brenda konstruktorit ne rreshtin $this->shpejtesia = $shpejtesia;
, i jepet vlere variablit anetare $shpejtesia
, vlera qe kalohet ne konstruktor. Lind pyetja sesi do ja kalojme keto argumente konstruktorit pasi ky funksion nuk therritet si funksionet e zakonshme, por therritet automatikisht ne momentin e krijimit te nje objekti te ri. Shohim shembullin ne vazhdim:
<?php
//Krijojme nje makine qe do te kete nje shpejtesi fillestare 10.
$makina1 = new Makine(10);
//Krijojme nje makine qe do te kete nje shpejtesi fillestare 30.
$makina2 = new Makine(30);
Argumentet e konstruktorit kalohen ne momentin e ndertimit te objektit, duke i kaluar ne brendesi te kllapave (
dhe )
qe vijne pas emrit te klases, ne kete rast Makine(10)
. Numri i argumenteve qe kalohet nuk eshte i percaktuar, por varet nga numri i parametrave qe kemi deklaruar ne funksionin __construct
te klases.
Destruktori
Ashtu si funksioni __construct
, ne klase gjendet nje funksion __destruct()
i cili therritet automatikisht kur ne fshijme nje objekt te caktuar p.sh. nepermjet funksionit unset()
si ne shembullin e meposhtem:
<?php
//Krijojme nje makine qe do te kete nje shpejtesi fillestare 10.
$makina1 = new Makine(10);
unset($makina1); //Automatikisht therritet funksioni __destruct i klases Makine
Edhe pse nuk kemi deklaruar nje funksion te tille, PHP-ja ka deklaruar nje te fshehur default per ne. Ne mund ta ndryshojme kete funksion duke e deklaruar ne klase:
<?php
class Makine {
public $shpejtesia = 120;
function __construct( $shpejtesia ) {
$this->shpejtesia = $shpejtesia;
}
function __destruct() {
print ("Objekti po fshihet!");
}
}
Ne rast se ne deklarojme funksionin __destruct
, dhe vendosim ne trupin e tij p.sh. permbajtjen print ("Objekti po fshihet!")
, atehere gjate fshirjes se objektit printohet edhe mesazhi i mesiperm Objekti po fshihet!
.